#ifndef QUERYTODASLASLINEAS_H_
#define QUERYTODASLASLINEAS_H_

#include "Query.h"

class QueryTodasLasLineas : public Query {
public:
	QueryTodasLasLineas(){};
	virtual ~QueryTodasLasLineas(){};

	void execute(ArbolUB<DIMENSION_CLAVES, CANTIDAD_BITS_CLAVES>& arbol, ParametroQuery* parametroQuery, std::string archivoSalida){
		std::cout << "Query Todas Las Lineas " << archivoSalida << std::endl;
		std::ofstream arch;
		arch.open(archivoSalida);
		if (!arch.good()){
			std::cout << "No se pudo abrir archivo " << archivoSalida << std::endl;
			return;
		}

    	Mapeador* mapeador = Mapeador::getInstance();

	    Point<DIMENSION_CLAVES>* min = parametroQuery->getMin();
	    Point<DIMENSION_CLAVES>* max = parametroQuery->getMax();

	    IteradorUB<DIMENSION_CLAVES, CANTIDAD_BITS_CLAVES> iterador(arbol, *min, *max);
	    std::set<std::string> lineas;

	    auto func = [&lineas, &mapeador](Point<DIMENSION_CLAVES> point){ lineas.insert( mapeador->mapIdToString(point[0]) ); };
        iterador.start(func);

	    for (auto it = lineas.begin(); it != lineas.end(); ++it)
	    	arch << *it << std::endl;

	    arch.close();
	}

};

#endif /*QUERYTODASLASLINEAS_H_*/
